package unq.uis.robots.applicationsModels;

import java.io.Serializable;
import java.util.List;


import org.uqbar.commons.model.UserException;
import org.uqbar.commons.utils.Observable;

import unq.uis.robots.model.MejoraDeRobot;
import unq.uis.robots.model.Robot;
import unq.uis.robots.model.Sistema;

@Observable
public class RobotVista implements Serializable{

	private static final long serialVersionUID = 1L;
	public static final String DANIO = "danio";
	public static final String DANIOAREPARAR = "danioAReparar";
	public static final String COSTODEREPARACION = "costoDeReparacion";
	public static final String MEJORASELECCIONADA = "mejoraSeleccionada";
	public static final String MEJORASDISPONIBLES = "mejorasDisponibles";	
	
	private Robot robot;
	private int danioAReparar;
	private int costoDeReparacion;
	private MejoraDeRobot mejoraSeleccionada;	
	private List<MejoraDeRobot> mejorasDisponibles;
	
	public RobotVista(Robot robotSeleccionado) {
		this.mejorasDisponibles = Sistema.getInstance().getMejorasDisponibles();
		this.robot = robotSeleccionado;
	}
	
	public void repararRobot(){		
		this.robot.reparar(this.costoDeReparacion, this.danioAReparar);		
		//ObservableUtils.forceFirePropertyChanged(this.robot.getDuenio(), "dinero", this.robot.getDuenio().getDinero());
	}
	
	public void mejorarRobot(){
		this.robot.mejorar(this.mejoraSeleccionada);
	}	
	
	public int getDanio() {
		return this.robot.getDanio();
	}
	public void setDanio(int danio) {
		this.robot.setDanio(danio);	
	}
	
	public int getDanioAReparar() {
		return danioAReparar;
	}

	public void setDanioAReparar(int danioAReparar) {
		this.danioAReparar = danioAReparar;
		this.setCostoDeReparacion(Sistema.getInstance().getCostoDeReparacion(danioAReparar));
		this.validarDineroSuficienteParaReparar();
		this.validarQueNoSeReparaMasDeLoNecesario();
	}
	
	private void validarQueNoSeReparaMasDeLoNecesario() {
		if(this.robot.getDanio() < this.danioAReparar)
			throw new UserException("El danio a reparar es mayor que el danio del robot");		
	}

	public void validarDineroSuficienteParaReparar(){
		if(this.costoDeReparacion > this.robot.getDuenio().getDinero())
			throw new UserException("Dinero insuficiente");
	}
	
	private void setCostoDeReparacion(int i) {
		this.costoDeReparacion = i;		
	}
	public Robot getRobot() {
		return robot;
	}
	public void setRobot(Robot robot) {
		this.robot = robot;
	}
	public MejoraDeRobot getMejoraSeleccionada() {
		return mejoraSeleccionada;
	}
	public void setMejoraSeleccionada(MejoraDeRobot mejoraSeleccionada) {
		this.mejoraSeleccionada = mejoraSeleccionada;
		this.validarDineroSuficienteParaMejorar();
	}
	public void validarDineroSuficienteParaMejorar() {
		if(this.mejoraSeleccionada.getPrecio() > this.robot.getDuenio().getDinero())
			throw new UserException("Dinero insuficiente");
	}

	public List<MejoraDeRobot> getMejorasDisponibles() {
		return this.mejorasDisponibles;
	}
	public void setMejorasDisponibles(List<MejoraDeRobot> mejorasDisponibles) {
		this.mejorasDisponibles = mejorasDisponibles;		
	}
	public int getCostoDeReparacion() {
		return costoDeReparacion;
	}

	public String getNombreRobot() {
		return robot.getNombre();
	}

	public int getPoder() {
		return robot.getPoderTotal();
	}
	
	public int getCalcularCosto(){
		return Sistema.getInstance().getCostoDeReparacion(danioAReparar);
		//return this.costoDeReparacion;
	}

}
